# !/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
===========================
@Time : 2022/8/8 0008 22:34
@Author : 测试开发工程师
@File : 1. jenkins api 接口.py
@Software: PyCharm
============================
"""

"""
Jenkins API 简介

    Jenkins 对外暴露的动作入口
    为外部程序提供入口，可以控制 Jenkins
    支持协议： Http
    API 接口支持用户名，密码认证
    Jenkins API 支持的典型功能：运行 Job ，查看任务状态，返回任务编号等

Jenkins 环境准备：
    创建一个有任务和状态权限的用户
    准备一个打算通过 API 远程控制的任务
    较老版本的 jenkins 关闭跨站脚本伪造请求保护，新的采用 Crumb 
    
远程调用 Jenkins API 启动任务
    任务名： first_job 
    远程 API 服务地址： http://81.68.64.149/:8080/job/first_job/build
    请求方法：POST
    用户名。密码添加方法： username:password@hostname:port
    运行期望结果：
        任务启动
        服务返回 http stauts:201
        
远程调用 Jenkins API 返回最新任务编号
    任务名： first_job
    远程 API 服务地址：
    http://106.53.223.46:8080/job/first_job/lastBuild/buildNumber
    请求方法：GET
    用户名。密码添加方法： username:password@hostname:port
        运行期望结果：
        任务启动
        服务返回 http stauts:201
    

远程调用 Jenkins API 查询任务状态
    任务名： first_job
    远程 API 服务地址：
    http://106.53.223.46:8080/job/first_job/<build number>/api/json
    请求方法：GET
    用户名。密码添加方法： username:password@hostname:port
        运行期望结果：
        任务启动
        服务返回 http stauts:200
    
远程调用Jenkins API 启动任务
    任务名：first_job
    远程 API 服务地址： http://106.53.223.46:8080/job/first_job/bulid
    请求方法：POST
    用户名。密码添加方法： username:password@hostname:port
        运行期望结果：
        任务启动
        服务返回 http stauts:201

Jenkinsapi库
    前面所讲的几个链接可以自己去封装 api 调用
    由于已经存在了轮子，故也能直接使用已经造好的轮子
    pip install jenkinsapi
    from jenkinsapi.jenkins import Jenkins
    jk = Jenkins(url,username,password,useCrumb=True)
    这样就进行api的调用了

"""

import requests
import json

url = "http://admin:Jpb@214829112@81.68.64.149:8080/job/demo/"
res = requests.post(url)
print(res.text)

url = "http://admin:Jpb@214829112@81.68.64.149:8080/job/demo/lastBuild/buildNumber"
res = requests.get(url)
# 结果是 ： 1634
print(res.text)

url = "http://admin:Jpb@214829112@81.68.64.149:8080/job/first_job/5/api/json"
res = requests.get(url)
print(res.text)
"""
    {
      "_class": "hudson.model.FreeStyleBuild",
      "actions": [
        {
          "_class": "hudson.model.CauseAction",
          "causes": [
            {
              "_class": "hudson.model.Cause$UserIdCause",
              "shortDescription": "Started by user admin",
              "userId": "admin",
              "userName": "admin"
            }
          ]
        },
        {},
        {},
        {},
        {
          "_class": "org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction"
        }
      ],
      "artifacts": [],
      "building": false,
      "description": null,
      "displayName": "#5",
      "duration": 12,
      "estimatedDuration": 23,
      "executor": null,
      "fullDisplayName": "first_job #5",
      "id": "5",
      "keepLog": false,
      "number": 5,
      "queueId": 1659,
      "result": "SUCCESS",
      "timestamp": 1665326190339,
      "url": "http://81.68.64.149:8080/job/first_job/5/",
      "builtOn": "",
      "changeSet": {
        "_class": "hudson.scm.EmptyChangeLogSet",
        "items": [],
        "kind": null
      },
      "culprits": []
    }

"""
print(json.dumps(res.json(), indent=2))
